package com.boardgamelib.base.system;

import java.util.Map;
import java.util.TreeMap;

import com.boardgamelib.base.direzioni.DirezioniCelleQuadrate;
import com.boardgamelib.base.entity.CellaQuadrata;
import com.boardgamelib.base.entity.TabelloneRettangolare;
import com.boardgamelib.entity.Giocatore;
import com.boardgamelib.entity.Pezzo;
import com.boardgamelib.system.SistemaCheGestisceLeCelleVicineOvveroQuelleProssime;

/** TODO Commenti
 * 
 * @author g.terenziani
 *
 */
public class SistemaProssimitaQuadrato<C extends CellaQuadrata<P>, P extends Pezzo<? extends Giocatore>> 
	implements SistemaCheGestisceLeCelleVicineOvveroQuelleProssime<DirezioniCelleQuadrate, C>{

	private TabelloneRettangolare<C, P> tabellone;
	
	public SistemaProssimitaQuadrato(TabelloneRettangolare<C, P> tabellone) {
		this.tabellone = tabellone;
	}
	
	public Map<DirezioniCelleQuadrate, C> getCelleProssime(C cella) {
		Map<DirezioniCelleQuadrate, C>rv = new TreeMap<DirezioniCelleQuadrate, C>();
		for (DirezioniCelleQuadrate d : DirezioniCelleQuadrate.values()) {
			C tmp = getCellaSuccessiva(cella, d);
			if (tmp != null) {
				rv.put(d, tmp);
			}
		}
		return rv;
	}

	public C getCellaSuccessiva(C cella,
			DirezioniCelleQuadrate direzione) {
		int indice = cella.getIndice();
		int riga = indice / tabellone.getDimensioneX();
		int colonna = indice % tabellone.getDimensioneX();
		switch(direzione) {
		case NORD:		// Riga++
			riga++;
			break;
		case NORDEST:	// Riga++ Colonna++
			riga++;
			colonna++;
			break;
		case EST:		// Colonna++
			colonna++;
			break;
		case SUDEST:	// Riga-- colonna++
			riga--;
			colonna++;
			break;
		case SUD:		// riga--
			riga--;
			break;
		case SUDOVEST:	// Riga-- Colonna--
			riga--;
			colonna--;
			break;
		case OVEST:		// colonna--
			colonna--;
			break;
		case NORDOVEST:	// riga++ Colonna--
			riga++;
			colonna--;
			break;
		}
		indice = indiceDelTabellone(riga, colonna);
		if (indice != -1)
			return tabellone.getCella(indice);
		return null;
	}
	
	/** Ritorna l'indice del tabellone se la combinazione riga/colonna stanno nel tabellone, 
	 * -1 altrimenti
	 * @param riga
	 * @param colonna
	 * @return
	 */
	public int indiceDelTabellone(int riga, int colonna) {
		if (riga >= 0 && riga < tabellone.getDimensioneX()) {
			if (colonna >= 0 && colonna <= tabellone.getDimensioneY()) {
				return (riga * tabellone.getDimensioneX()) + colonna;
			}
		}
		return -1;
	}

}
